package com.yootk.main;

import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

/**
 * ExpressionParser，表达式的解析处理类
 * Expression，实现表达式的最终的处理操作
 * EvaluationContext，进行上下文所需的环境配置，例如：设置变量内容
 */
public class Demo01_Basic {
    public static void main(String[] args) {
//        test1();
        test2();
    }

    /**
     * Spring表达式基本使用
     */
    public static void test1() {
        // 此时的表达式里面设置有两个变量的信息，一个是start、另一个是end
        String str = "(\"www.\" + \"yootk.com\").substring(#start, #end).toUpperCase()";    // 定义字符串
        System.err.println("字符串：" + str);
        ExpressionParser parser = new SpelExpressionParser();   // 定义SpEL解析器
        Expression exp = parser.parseExpression(str);   // 表达式解析
        // 在表达式执行之前还需要考虑两个占位符的配置问题
        EvaluationContext context = new StandardEvaluationContext();    // 表达式上下文配置
        context.setVariable("start", 4);
        context.setVariable("end", 9);
        System.err.println("SpEL处理结果：" + exp.getValue(context));  // 表达式计算
    }

    /**
     * SpEL解析原理
     * 第一阶段：表达式词法分析
     * 第二阶段：表达式语法分析
     * 第三阶段：生成表达式对象
     */
    public static void test2() {
        String str = "10 + 20";     // 实现一个加法计算
        ExpressionParser parser = new SpelExpressionParser();
        Expression exp = parser.parseExpression(str);
        System.err.println("SpEL处理结果：" + exp.getValue());
    }
}
